package com.zw.a.basic.a13.demo07_deadlock;

//案例: 演示死锁.
/*
    细节:
        死锁指的是同步代码块的嵌套, 只在面试用, 实际开发不用.
    死锁原理:
        1. 死锁需要两个线程两把锁.
        2. 一个线程先抢A锁, 然后抢B锁.
        3. 另一个线程先抢B锁, 后抢A锁, 就有可能发生死锁现象.
        4. 为了让效果更明显, 用while(true)改进.
 */
public class DeadLock {
    //1. 定义两把锁.
    private static final String LOCKA = "锁A";
    private static final String LOCKB = "锁B";

    //main方法, 作为程序的主入口
    public static void main(String[] args) {
        //2.  一个线程先抢A锁, 然后抢B锁.
        new Thread("曹操") {
            @Override
            public void run() {
                // 4. 为了让效果更明显, 用while(true)改进.
                while (true) {
                    //先抢A锁, 然后抢B锁.
                    synchronized (LOCKA) {
                        System.out.println(getName() + "获取到" + LOCKA + ", 等待" + LOCKB);
                        synchronized (LOCKB) {
                            System.out.println(getName() + "获取到" + LOCKB + ", 成功进入小黑屋");
                        }
                    }
                }
            }

        }.start();

        //3. 另一个线程先抢B锁, 后抢A锁, 就有可能发生死锁现象.
        new Thread("刘备") {
            @Override
            public void run() {
                // 4. 为了让效果更明显, 用while(true)改进.
                while (true) {
                    //先抢A锁, 然后抢B锁.
                    synchronized (LOCKB) {
                        System.out.println(getName() + "获取到" + LOCKB + ", 等待" + LOCKA);
                        synchronized (LOCKA) {
                            System.out.println(getName() + "获取到" + LOCKA + ", 成功进入小黑屋");
                        }
                    }
                }
            }
        }.start();
    }
}
